/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package AST;

import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Eddy
 */
public class Compas extends Instruccion implements Cloneable{
    
    public int Repetir;
    LinkedList <Nota> notas;
    Double TiempoTotal=0.0;
    
    public boolean Sol=false;
    public boolean Do=false;
    public boolean Re=false;
    public boolean Fa=false;
    
       
    public Compas subCompas;
    
    public LinkedList <Compas> lsubCompas;
    
    public void addCompas(Compas sc)
    {
        lsubCompas.addFirst(sc);
      
    
    }
    
    public void AddNota(Nota sig)
    {
        this.notas.add(sig);
    }
            
    public Compas(LinkedList<Nota> ln,Compas sc,int mult)
    {
        
        notas=ln;
        
        Repetir=mult;
        subCompas=sc;
            
    }
    
    public Compas(int l,int c,LinkedList<Nota> ln,Compas sc,int mult)
    {
        NoLinea=l;
        Columna=c;
        
        notas=ln;
        
        Repetir=mult;
        subCompas=sc;
            
    }
    public boolean CargarTS()
    {
        boolean res=true;
        int i;
        if(lsubCompas!=null)
        {
            for(i=0;i<this.lsubCompas.size()&&res;i++)
            {          
                lsubCompas.get(i).Do=Do;
                lsubCompas.get(i).Re=Re;
                lsubCompas.get(i).Sol=Sol;
                lsubCompas.get(i).Fa=Fa;
                
                lsubCompas.get(i).tabla=tabla;
               // lsubCompas.get(i).Repetir=Repetir;
                res=lsubCompas.get(i).CargarTS();
                //subCompas.tabla=tabla;                       
                //res=subCompas.CargarTS();
                //TiempoTotal=subCompas.TiempoTotal;
            }
        }
        else{
        for(i=0;i<notas.size()&&res;i++)
        {
            if(notas.get(i)!=null)
            {
            notas.get(i).Sol=Sol;
            notas.get(i).Do=Do;
            notas.get(i).Re=Re;
            notas.get(i).Fa=Fa;
            
            notas.get(i).tabla=tabla;
            
            res=notas.get(i).CargarTS();
            if(res){
            TiempoTotal=TiempoTotal+notas.get(i).Tiempo;//Verificar si el tiempo del compas es acorde al compas establecido
            }            
            }
        }
        if(TiempoTotal==tabla.Compas){res=true;}
        else{res=false;Errores.InsertarError(NoLinea,Columna, "Error: El tiempo por compas es de  "+tabla.Compas+" tiempo del compas:"+TiempoTotal);
        }//error tiempo del compas no conicide con el declarado
        }
        
        return res;
    }
    
    public boolean Traduccion()
   {
       boolean res=true;
       int i,ini=0;
       String tempTT="";
       String tempTTABC="";
       this.Traduccion="";
       this.TraduccionABC4J="";
       
       if(this.lsubCompas!=null)
       {
           for(i=0;i<this.lsubCompas.size()&&res;i++)
           {
               res=this.lsubCompas.get(i).Traduccion();
               tempTT=tempTT+this.lsubCompas.get(i).Traduccion;
               tempTTABC=tempTTABC+"|"+this.lsubCompas.get(i).TraduccionABC4J;
               
           }       
          // System.out.println("++"+this.NoLinea+"----"+tempTT+"#####");
           this.Traduccion=tempTT;
           this.TraduccionABC4J=tempTTABC;
           ini=this.notas.size();
           if(this.Repetir>1)
           {
               String temp1TT="";
               String temp1TTABC="";
               String sep="";
               int j;
               for (j=0;j<this.Repetir;j++)
               {
                   temp1TT=temp1TT+""+this.Traduccion;
                   temp1TTABC=temp1TTABC+sep+this.TraduccionABC4J;
                   if(j==0){sep="|";}
               }
                       this.Traduccion=temp1TT;
                       this.TraduccionABC4J=temp1TTABC;
           }
           //Multiplicar compases
       }
       
          
                            
          for(i=ini;i<this.notas.size()&&res;i++)
           {
               res=this.notas.get(i).Traduccion();
               this.Traduccion=Traduccion+" "+this.notas.get(i).Traduccion;
               this.TraduccionABC4J=this.TraduccionABC4J+" "+this.notas.get(i).TraduccionABC4J;
           //    System.out.println("++"+this.NoLinea+"----"+this.Traduccion+"+++");
           }
       
       return res;
   }
    
    public Compas Clone()
    {
        Compas a=null;
        try {
            a=(Compas) super.clone();
        } catch (CloneNotSupportedException ex) {
            Logger.getLogger(Compas.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return a;
        
    }
}
